iT邦幫忙

2022 iThome 鐵人賽

DAY 29
0

Hello, 各位 iT 邦幫忙 的粉絲們大家好~~~

在本系列文會利用目前 Visual Studio 內建的專案樣本建立一個初始的 .NET MAUI 專案,並且透過此 .NET MAUI 專案來把 TopStore App 的開發從 Xamairn.Forms 轉換到 .NET MAUI 上進行。

本篇是 Re: 從零改成用 .NET MAUI 技術來繼續過去用 Xamarin 開發的一個 App : TopStore 系列 系列文的 EP29。


繼前一回完成 ProductDetailPageViewModel 的設計之後,來調整一下 ProductDetailPage 的畫面設計吧!

首先找到 Pages 資料夾開啟 "ProductDetailPage.xaml" 這個檔案:
01

接著針對 ContentPage 標記的內部屬性作一些調整跟新增的設定,大致上跟過去在撰寫 PersonDetailPage 時的頁面設計差不多,除了為了讓 ProductDetailPageViewModel 的資料型態能夠正確的識別,也增寫了 x:DataType 的設計之外,也增加了 ToolbarItems 的運用。

如果嫌麻煩可以先把下圖藍色框的 XAML 標記碼刪除:
02-1

再直接貼入下面的 XAML 標記碼:

    x:Class="TopStoreApp.Pages.ProductDetailPage"
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:viewmodels="clr-namespace:TopStoreApp.ViewModels"
    Title="{Binding EditProduct.Name}"
    x:DataType="viewmodels:ProductDetailPageViewModel">
    <ContentPage.ToolbarItems>
        <ToolbarItem Command="{Binding SaveCommand}" Text="{Binding IsEdit, Converter={StaticResource DetailPageToolBarItemDisplayText}, ConverterParameter='儲存,編輯'}" />
    </ContentPage.ToolbarItems>

完成結果如下圖紅框所示:
02-2

接著刪除本來 VerticalStackLayout 當中的 Label
03-1

完成後如下圖箭頭所示:
03-2

接著再透過 LabelEntry 等 UI 元件做為的 Product 資料呈現方式,只是這次 Product 的屬性資料比較多,對應撰寫起來會花上一些功夫:

<Label
    HorizontalOptions="StartAndExpand"
    HorizontalTextAlignment="Start"
    Text="名稱:"
    VerticalOptions="Center"
    VerticalTextAlignment="Center" />
<Entry
    HorizontalOptions="FillAndExpand"
    HorizontalTextAlignment="Start"
    IsEnabled="{Binding IsEdit}"
    Placeholder="請輸入名稱..."
    Text="{Binding EditProduct.Name}"
    VerticalOptions="Center"
    VerticalTextAlignment="Center" />
<Label x:Name="NameError" IsVisible="False" TextColor="Red" />
<Label
    HorizontalOptions="StartAndExpand"
    HorizontalTextAlignment="Start"
    Text="商品編號:"
    VerticalOptions="Center"
    VerticalTextAlignment="Center" />
<Entry
    HorizontalOptions="FillAndExpand"
    HorizontalTextAlignment="Start"
    IsEnabled="{Binding IsEdit}"
    Keyboard="Text"
    Placeholder="請輸入商品編號..."
    Text="{Binding EditProduct.Sn}"
    VerticalOptions="Center"
    VerticalTextAlignment="Center" />
<Label x:Name="SnError" IsVisible="False" TextColor="Red" />
<Label
    HorizontalOptions="StartAndExpand"
    HorizontalTextAlignment="Start"
    Text="商品建議售價:"
    VerticalOptions="Center"
    VerticalTextAlignment="Center" />
<Entry
    HorizontalOptions="FillAndExpand"
    HorizontalTextAlignment="Start"
    IsEnabled="{Binding IsEdit}"
    Keyboard="Numeric"
    Placeholder="請輸入建議售價..."
    Text="{Binding EditProduct.Msrp}"
    VerticalOptions="Center"
    VerticalTextAlignment="Center" />
<Label x:Name="MsrpError" IsVisible="False" TextColor="Red" />
<Label
    HorizontalOptions="StartAndExpand"
    HorizontalTextAlignment="Start"
    Text="商品售價:"
    VerticalOptions="Center"
    VerticalTextAlignment="Center" />
<Entry
    HorizontalOptions="FillAndExpand"
    HorizontalTextAlignment="Start"
    IsEnabled="{Binding IsEdit}"
    Placeholder="請輸入售價..."
    Text="{Binding EditProduct.Price}"
    VerticalOptions="Center"
    VerticalTextAlignment="Center" />
<Label x:Name="PriceError" IsVisible="False" TextColor="Red" />
<Label
    HorizontalOptions="StartAndExpand"
    HorizontalTextAlignment="Start"
    Text="單位:"
    VerticalOptions="Center"
    VerticalTextAlignment="Center" />
<Entry
    HorizontalOptions="FillAndExpand"
    HorizontalTextAlignment="Start"
    IsEnabled="{Binding IsEdit}"
    Keyboard="Text"
    Placeholder="請輸入單位..."
    Text="{Binding EditProduct.Unit}"
    VerticalOptions="Center"
    VerticalTextAlignment="Center" />
<Label x:Name="UnitError" IsVisible="False" TextColor="Red" />
<Label
    HorizontalOptions="StartAndExpand"
    HorizontalTextAlignment="Start"
    Text="包裝個數:"
    VerticalOptions="Center"
    VerticalTextAlignment="Center" />
<Entry
    HorizontalOptions="FillAndExpand"
    HorizontalTextAlignment="Start"
    IsEnabled="{Binding IsEdit}"
    Keyboard="Numeric"
    Placeholder="請輸入包裝個數..."
    Text="{Binding EditProduct.Package}"
    VerticalOptions="Center"
    VerticalTextAlignment="Center" />
<Label x:Name="PackageError" IsVisible="False" TextColor="Red" />
<Label
    HorizontalOptions="StartAndExpand"
    HorizontalTextAlignment="Start"
    Text="備註:"
    VerticalOptions="Center"
    VerticalTextAlignment="Center" />
<Entry
    HorizontalOptions="FillAndExpand"
    HorizontalTextAlignment="Start"
    IsEnabled="{Binding IsEdit}"
    Keyboard="Text"
    Placeholder="請輸入備註..."
    Text="{Binding EditProduct.Note}"
    VerticalOptions="Center"
    VerticalTextAlignment="Center" />
<Label x:Name="NoteError" IsVisible="False" TextColor="Red" />

完成後大概如下圖紅框所示:
03-3

再來就開啟 "ProductDetailPage.xaml.cs" 這個檔案:
04

要來調整類別的建構方法設計:
05-1

把原本的建構方法封裝成 private 後,再另外設計一個可傳入 ProductDetailPageViewModel 物件作為參數的建構方法,並在此建構方法執行中設定其 BindingContext 屬性值指定為傳入的參數:

public ProductDetailPage(ViewModels.ProductDetailPageViewModel productDetailPageViewModel) : this()
{
    BindingContext = productDetailPageViewModel;
}

完成的新建構方法如下圖紅框所示:
05-2

完成後,就可以開啟 MauiProgram.cs 檔案:
06

並且找到先前有設計的 RegisterAppViewsAndViewModels() 方法:
07-1

並加入以下程式碼:

builder.Services.AddTransient<Pages.ProductDetailPage>();
builder.Services.AddTransient<ViewModels.ProductDetailPageViewModel>();

完成後如下圖紅框所示:
07-2

以上完成囉~~~

有興趣的人可以測試看看,是否可以正確地從 "物品項" 的列表選到某個物品項目後,就轉跳到此 ProductDetailPage 並且能夠進行 "編輯" 與 "儲存" 的功能吧!

本 EP 介紹所完成的範例程式碼可在此下載


PS 本篇上傳的程式碼已有修正在 EP24 所撰寫的程式碼,GoodsPageViewModel 中撰寫的 Edit() 方法,其中的註解該行,最後傳遞參數的 personId 應為 productId。

PS' 本篇有用到在先前 Re: 從零開始用 Xamarin 技術來復刻過去開發的一個 App : TopStore 當中所介紹的 EP12EP13EP25 的運用,就不在冗贅介紹了。


上一篇
EP 28: Create ProductDetailPageViewModel for ProductDetailPage in TopStoreApp
下一篇
EP 30: Edit ProductDetailPage for showing Product data in TopStoreApp
系列文
Re: 從零改用 .NET MAUI 技術來繼續過去用 Xamarin 技術開發的一個 App : TopStore30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言